package simple.string;

/**
 * @Desc <a href="https://leetcode.cn/problems/buddy-strings/">859. 亲密字符串</a>
 * 给你两个字符串 s 和 goal ，只要我们可以通过交换 s 中的两个字母得到与 goal 相等的结果，就返回 true ；否则返回 false 。
 * 交换字母的定义是：取两个下标 i 和 j （下标从 0 开始）且满足 i != j ，接着交换 s[i] 和 s[j] 处的字符。
 * 例如，在 "abcd" 中交换下标 0 和下标 2 的元素可以生成 "cbad" 。
 * 示例 1：
 *   输入：s = "ab", goal = "ba"
 *   输出：true
 *   解释：你可以交换 s[0] = 'a' 和 s[1] = 'b' 生成 "ba"，此时 s 和 goal 相等。
 * 示例 2：
 *   输入：s = "ab", goal = "ab"
 *   输出：false
 *   解释：你只能交换 s[0] = 'a' 和 s[1] = 'b' 生成 "ba"，此时 s 和 goal 不相等。
 * 示例 3：
 *   输入：s = "aa", goal = "aa"
 *   输出：true
 *   解释：你可以交换 s[0] = 'a' 和 s[1] = 'a' 生成 "aa"，此时 s 和 goal 相等。
 * 提示：
 *   1 <= s.length, goal.length <= 2 * 10^4
 *   s 和 goal 由小写英文字母组成
 * @Date 2023/6/28 21:18
 * @Created by 刘学松
 */
public class 亲密字符串 {
    public static void main(String[] args) {
        buddyStrings("abac", "abad");
    }
    public static boolean buddyStrings(String s, String goal) {
        int length =s.length();
        if (length != goal.length()) {
            return false;
        }
        if (s.equals(goal)) {
            int[] count = new int[123];
            for (char c : s.toCharArray()) {
                ++count[c];
                if (count[c] == 2) {
                    return true;
                }
            }
            return false;
        }
        char c1 = 0, c2 = 0, c3 = 0, c4 = 0;
        for (int i = 0; i < length; i++) {
            char cs = s.charAt(i), cg = goal.charAt(i);
            if (cs != cg) {
                if (c1 == 0) {
                    c1 = cs;
                    c2 = cg;
                } else if (c3 == 0) {
                    c3 = cs;
                    c4 = cg;
                } else {
                    return false;
                }
            }
        }
        return c3 != 0 && c1 == c4 && c2 == c3;
    }
}
